;(function(){

  // 基本类
  class Person {
    // 三种属性 
    // 1. 实例属性 实例化后可以在实例化对象上进行访问和修改
    name: string = 'Tom';
    // 2. 类属性(静态属性: 不需要创建对象即可使用) 只能通过 类名.属性名 的方式进行访问
    static hairColor: string = 'black';
    // 3. 只读属性
    readonly gender: string = 'Male';
    // 4. 静态只读属性
    static readonly species: string = 'Human';
  
    // 构造函数
    constructor(public age: number) {
      this.age = age;
    }
    
    // 实例方法
    sayHello(language: string): string {
      return `Hello, ${language}!`;
    }
    
    // 静态方法
    static sayGoodbye() {
      console.log('Goodbye');
    }
  }

  // 抽象类 专门用于继承的类 只能被继承不能实例化
  // 可以添加抽象方法
  // 抽象类的实现是依靠ts编译器的检查 而非js手段对吗
  abstract class Animal {
    constructor(public name: string) {}
    // 定义一个抽象方法
    // 必须在抽象类中定义 子类必须对抽象方法进行重写 就是子类必须要实现一下这个方法 不实现就会报错
    abstract sayHello(): void;
  }
  
  let p = new Person(25);
  console.log(p.name); // Tom
  console.log(Person.hairColor); // black
})()



